package com.albaba.designpattern.proxy.text_003;


import org.aopalliance.intercept.MethodInvocation;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.springframework.format.datetime.DateFormatter;

import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;

/**
 * @Description: TODO
 * @Author zx
 * @Date 2025/2/20 15:07
 * @Version 1.0
 */
public class UserLogProxy implements MethodInterceptor {

    /**
     * 生成CGLIB动态代理类方法
     * @param target 需要被代理的目标类
     * @return 代理类对象
     */
    public Object getLogProxy(Object target) {

        // 增强器类，用来创建动态代理类
        Enhancer enhancer = new Enhancer();

        // 设置代理类的父类字节码对象
        enhancer.setSuperclass(target.getClass());

        // 设置回调
        enhancer.setCallback(this);

        // 创建代理对象，并返回
        return enhancer.create();
    }


    /**
     *
     * @param o 代理对象
     * @param method 目标对象方法的Method实例
     * @param objects 方法参数
     * @param methodProxy 代理类对象中的方法的method实例
     * @return 方法返回值
     * @throws Throwable
     */
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        LocalDateTime calendar = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");
        System.out.println(formatter.format(calendar) + "[" + method.getName() + "]");
        Object result = methodProxy.invokeSuper(o, objects);
        return result;
    }
}
